package kn.pulldata.common;

import java.util.concurrent.*;

public class ThreadPoolUtil {

    // 线程池实例，作为单例存在
    private static final ExecutorService executor = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors(),      // 核心线程数
            Runtime.getRuntime().availableProcessors()*2,  // 最大线程数
            60,    // 空闲线程存活时间
            TimeUnit.SECONDS, // 时间单位
            new ArrayBlockingQueue<>(1000), // 工作队列
            Executors.defaultThreadFactory(), // 线程工厂
            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
    );


    // 公共方法，返回线程池实例
    public static ExecutorService getExecutor() {
        return executor;
    }

    // 私有构造函数，防止外部实例化
    private ThreadPoolUtil() {}

    // 提交Runnable任务
    public static void execute(Runnable task) {
        executor.execute(task);
    }

    // 提交Callable任务并返回Future
    public static <T> Future<T> submit(Callable<T> task) {
        return executor.submit(task);
    }

    // 优雅关闭线程池
    public static void shutdown() {
        executor.shutdown();
        try {
            // 等待所有任务完成，或者等待超时
            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                // 超时后尝试停止所有正在执行的任务
                executor.shutdownNow();
            }
        } catch (InterruptedException e) {
            // 当前线程在等待过程中被中断，尝试停止所有任务
            executor.shutdownNow();
            // 保持中断状态
            Thread.currentThread().interrupt();
        }
    }

    // 获取线程池的状态（主要用于调试）
    public static String getStatus() {
        return executor.toString();
    }
}
